]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
shell-screenshot: Use mutter paint signals to optionally draw cursor
authorMarco Trevisan (Treviño) <mail@3v1n0.net>
Wed, 13 Feb 2019 01:23:41 +0000 (02:23 +0100)
committerJonas Ådahl <jadahl@gmail.com>
Fri, 1 Mar 2019 17:12:53 +0000 (17:12 +0000)
Under wayland, if the cursor should be included when doing a fullscreen
screenshot, we can rely on mutter "paint" signal to have it composited for free.
Otherwise if it's not requested, we can use the "actors-painted" signal to get a
stage texture before the mouse overlay has been added.

Instead, under X11 or when only a window screenshot is requested, we still
need to draw it manually.

https://bugzilla.gnome.org/show_bug.cgi?id=765011
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/5

src/shell-screenshot.c

index 4ad90a1ae88e6dbe49e665b582974215d10413c9..17b0f93eab37055eccece59847fe00bfe1e48f86 100644 (file)
@@ -40,6 +40,13 @@ struct _ShellScreenshotPrivate
   gboolean include_frame;
 };
 
+typedef enum
+{
+  SHELL_SCREENSHOT_SCREEN,
+  SHELL_SCREENSHOT_WINDOW,
+  SHELL_SCREENSHOT_AREA,
+} ShellScreenshotMode;
+
 G_DEFINE_TYPE_WITH_PRIVATE (ShellScreenshot, shell_screenshot, G_TYPE_OBJECT);
 
 static void
@@ -257,12 +264,15 @@ do_grab_screenshot (ShellScreenshot *screenshot,
 }
 
 static gboolean
-should_draw_cursor_image (void)
+should_draw_cursor_image (ShellScreenshotMode mode)
 {
-  g_autoptr (GSettings) settings = g_settings_new (A11Y_APPS_SCHEMA);
+  if (mode == SHELL_SCREENSHOT_WINDOW || !meta_is_wayland_compositor ())
+    {
+      g_autoptr (GSettings) settings = g_settings_new (A11Y_APPS_SCHEMA);
 
-  if (!g_settings_get_boolean (settings, MAGNIFIER_ACTIVE_KEY))
-    return TRUE;
+      if (!g_settings_get_boolean (settings, MAGNIFIER_ACTIVE_KEY))
+        return TRUE;
+    }
 
   return FALSE;
 }
@@ -524,6 +534,7 @@ shell_screenshot_screenshot (ShellScreenshot     *screenshot,
 {
   ClutterActor *stage;
   ShellScreenshotPrivate *priv = screenshot->priv;
+  const char *paint_signal;
   GTask *result;
 
   if (priv->filename != NULL) {
@@ -543,13 +554,22 @@ shell_screenshot_screenshot (ShellScreenshot     *screenshot,
   g_task_set_source_tag (result, shell_screenshot_screenshot);
 
   priv->filename = g_strdup (filename);
-  priv->include_cursor = include_cursor && should_draw_cursor_image ();
+  priv->include_cursor = FALSE;
 
   stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global));
+  paint_signal = "actors-painted";
 
   meta_disable_unredirect_for_display (shell_global_get_display (priv->global));
 
-  g_signal_connect_after (stage, "paint", G_CALLBACK (grab_screenshot), result);
+  if (include_cursor)
+    {
+      if (should_draw_cursor_image (SHELL_SCREENSHOT_SCREEN))
+        priv->include_cursor = TRUE;
+      else
+        paint_signal = "paint";
+    }
+
+  g_signal_connect_after (stage, paint_signal, G_CALLBACK (grab_screenshot), result);
 
   clutter_actor_queue_redraw (stage);
 }
@@ -717,7 +737,8 @@ shell_screenshot_screenshot_window (ShellScreenshot     *screenshot,
 
   priv->filename = g_strdup (filename);
   priv->include_frame = include_frame;
-  priv->include_cursor = include_cursor && should_draw_cursor_image ();
+  priv->include_cursor = include_cursor &&
+                         should_draw_cursor_image (SHELL_SCREENSHOT_WINDOW);
 
   stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global));